import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Shouji {
    public static void main(String[] args) {
      /*collect(Collector collector)
      * 收集流中的数据，放到集合中（List Set Map)*/
        ArrayList<String> list=new ArrayList();
        Collections.addAll(list,"张无忌-男-19","张无忌-男-19","浮云去-男-8","周韵穿-男-89","复印听-男-34","周韵-女-26");

        //收集到list集合中
        //需求：
        //把所有男性收集起来
        List<String> newList = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toList());
        //[张无忌-男-19, 张无忌-男-19, 浮云去-男-8, 周韵穿-男-89, 复印听-男-34]
        //Set集合
        Set<String> newList2 = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toSet());//底层HashSet
        //[浮云去-男-8, 周韵穿-男-89, 张无忌-男-19, 复印听-男-34] 无重复，乱序
        System.out.println(newList);
        System.out.println(newList2);
        //Map集合
        //谁为键，谁为值
        //键：姓名 值：年龄
        Map<String, Integer> collect = list.stream().filter(s -> "男".equals(s.split("-")[1]))
                /*toMap：参数一表示键的生成规则
                 *         参数二表示值的生成规则
                 * 参数一：
                 *         Function泛型一：表示流中每一个数据的类型
                 *                 泛型二：表示Map集合中键的数据类型
                 *         方法apply形参：一次表示流里面的每一个数据
                 *                  方法体：生成键的代码
                 *                  返回值：已经生成的键
                 * 参数二：
                 *        Function泛型一：表示流中每一个数据的类型
                 *                 泛型二：表示Map集合中值的数据类型
                 *     方法apply形参：一次表示流里面的每一个数据
                 *                   方法体：生成值的代码
                 *                   返回值：已经生成的值*/
                .collect(Collectors.toMap(new Function<String, String>() {
                    @Override
                    public String apply(String s) {
                        return s.split("-")[0];
                    }
                }, new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s.split("-")[2]);
                    }
                }));//不能有键值一样的数据出现
        System.out.println(collect);
  //简化
        Map<String, Integer> collect1 = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(
                        s -> s.split("-")[0],
                        s -> Integer.parseInt(s.split("-")[2])
                ));
        System.out.println(collect1);
    }
}
